package com.xuzmian.demo.kotlin

/**
 * 数据类，数据类必须满足以下要求：
 * 主构造函数需要至少有一个参数；
 * 主构造函数的所有参数需要标记为 val 或 var；
 * 数据类不能是抽象、开放、密封或者内部的；
 *（在1.1之前）数据类只能实现接口。
 *
 * 关于成员继承的这些规则：
 * 如果在数据类体中有显式实现 equals()、 hashCode() 或者 toString()，或者这些函数在父类中有 final 实现，那么不会生成这些函数，而会使用现有函数；
 * 如果超类型具有 open 的 componentN() 函数并且返回兼容的类型， 那么会为数据类生成相应的函数，并覆盖超类的实现。如果超类型的这些函数由于签名不兼容或者是 final 而导致无法覆盖，那么会报错；
 * 从一个已具 copy(……) 函数且签名匹配的类型派生一个数据类在 Kotlin 1.2 中已弃用，并且在 Kotlin 1.3 中已禁用。
 * 不允许为 componentN() 以及 copy() 函数提供显式实现。
 *
 * User数据类默认生成的copy函数如下：
 * fun copy(name: String = this.name, age: Int = this.age) = User(name, age)
 */
data class User(val name: String, val age: Int)



/**
 * 在类体中声明的属性：对于那些自动生成的函数(如equasl(),toString()方法)，编译器只使用在主构造函数内部定义的属性。
 * 即在以下例子中， toString()、 equals()、 hashCode() 以及 copy() 的实现中只会用到 name 属性，并且只有一个 component 函数 component1()。
 */
data class Person(val name: String) {
    var age: Int = 0
}

